home *** CD-ROM | disk | FTP | other *** search
- {
- > I have always addressed $B800 as the screen segment for
- > direct video writes in text.... Err, umm, does anyone have
- > the code to detect whether it is $B000 or $B800 (for
- > Herc.'s and the like)...
-
- I know you didn't ask for this, but...
-
- If you're on a EGA or better, this code should FORCE the screen segment to be
- at whereever you want even if it's a mono mode!
-
- BEGIN QUOTE OF CONVERSATION WITH 'NEON PROPHET' WHOEVER THAT IS
-
- >>Not sure what you mean here. Do you mean to use A000:0 for
- >>both text & graphics if you know it's an e/vga card?
- >
- >Yes, I mean I want to write to a text screen by accessing memory at
- >$A000:0 on an EGA+
-
- that's easy..
-
- Send a 6 to port 3CEh
- then in / out with port 3CFh (you gotta do this latching). Bitmaped :
- bit 0 Graphics mode = 1
- Textmode = 0
- bit 1 Chain Odd Maps To Even Maps (who knows.. :( )
- bits 2 - 3 memory map / size
- 00 A000 128k <-dangerous
- 01 A000 64K <-ok
- 10 B000 32k
- 11 B800 32k
- bits 4 - 7 Unused
-
- a quick note being that I haven't tested using A000 for text. But I suppose
- using mov ax, 3 / int 10h and then switching this register would work. Never
- set the first one if you are using QEMM. You *WILL* lock up the machine
- because it uses some of that space for memory addressing.
-
- Example code :
- mov dx, 3CEH
- mov al, 06h
- out dx, al
- inc dx
- in al, dx
- and al, 00001100b
- shr al, 1
- shr al, 1
- now, the current state of memory should be in AL.
-
- Hope this helps.
-
- END QUOTE
-
- and so do I. Haven't had a chance to try it yet.
-
- But this should set up B800 even on a mono system (please let me know if it
- works)
- }
- procedure initB800SegText;begin
- asm mov ax,3; int 10h; end;
- port[$3CE]:=2 or (3 shl 2);
- if port[$3CF]=0 then; {read to latch}
- end;
-
- procedure initA000SegText;begin
- asm mov ax,3; int 10h; end;
- port[$3CE]:=2 or (1 shl 2);
- if port[$3CF]=0 then; {read to latch}
- end;
-
- { this should report the current segment being used. }
-
- function segAddr:word;
- const table:array[0..3]of word=($A000,$A000,$B000,$B800); begin
- segAddr:=table[(port[$3CF]shr 2)and 3];
- end;
-
- {
- I don't believe any of these will work on a MDA or CGA, especially not the one
- for A000. I don't think they have that register...
- }